/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.uoc.tdp.pac4.cliente;


import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import java.util.Locale;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
//import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionEvent;

import edu.uoc.tdp.pac4.i18n.TDSLanguageUtils;
import edu.uoc.tdp.pac4.beans.Linia_peca;
import edu.uoc.tdp.pac4.beans.Marca_coche;
import edu.uoc.tdp.pac4.beans.Preu_peca;
import edu.uoc.tdp.pac4.beans.Tipus_peca;
import edu.uoc.tdp.pac4.comun.GestorInterface;
import edu.uoc.tdp.pac4.comun.Utils;
import edu.uoc.tdp.pac4.servidor.Servidor;

/**
 *
 * @author pguerreroj
 */
public class Pressupost extends JInternalFrame{
    
    private JPanel p;    
    private JLabel jLabel;    
    private JComboBox jComboBox;
    private JComboBox jComboBoxPeca1;
    private JComboBox jComboBoxPeca2;
    private JComboBox jComboBoxPeca3;    
    private JComboBox jComboBoxPeca4;
    private JTextField unitatsPeca1;
    private JTextField unitatsPeca2;
    private JTextField unitatsPeca3;
    private JTextField unitatsPeca4;       
    private JButton jButton2;
    private GestorInterface gestorPreus;
    private final String URL = "localhost";
    private final String JNDI_NAME ="CATL";
    private final int PORT = 1099;
    String [] titulos ={"Proveidor","Tipus","Preu", "Quantitat"};
    
    public Pressupost(){
        initComponents(); 
        seleccionDeIdioma();
        initComboMarca();
    }
    
    private void seleccionDeIdioma() {
        Locale localLocale = new Locale("es", "ES");
        TDSLanguageUtils.setDefaultLanguage("i18n/messages");
    }
    
    public void initComponents(){
        this.setTitle(TDSLanguageUtils.getMessage("Presupuesto.Titulo"));
        p= new JPanel();
        p.setLayout(null);
        //etiqueta 
        this.jLabel = new JLabel();
        this.jLabel.setBounds(new Rectangle(10, 10, 100, 30));
        this.jLabel.setText(TDSLanguageUtils.getMessage("Presupuesto.Marca"));
        p.add(jLabel);
        //combo marca
       
        
        this.unitatsPeca1 = new JTextField();
        this.unitatsPeca1.setBounds(new Rectangle(310, 70, 150, 30));
        unitatsPeca1.setSize(60, 25);
        this.add(unitatsPeca1);
        
        this.unitatsPeca2 = new JTextField();
        this.unitatsPeca2.setBounds(new Rectangle(310, 120, 150, 30));
        unitatsPeca2.setSize(60, 25);
        this.add(unitatsPeca2);
        
        this.unitatsPeca3 = new JTextField();
        this.unitatsPeca3.setBounds(new Rectangle(310, 170, 150, 30));
        unitatsPeca3.setSize(60, 25);
        this.add(unitatsPeca3);
        
        this.unitatsPeca4 = new JTextField();
        this.unitatsPeca4.setBounds(new Rectangle(310, 220, 150, 30));
        unitatsPeca4.setSize(60, 25);
        this.add(unitatsPeca4);
        
        // MArcas
        
        this.jComboBox = new JComboBox();
        this.jComboBox.setBounds(new Rectangle(110, 10, 150, 30));
        this.add(jComboBox);
        
        jComboBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent paramAnonymousActionEvent) {
                Marca_coche mc = (Marca_coche)jComboBox.getSelectedItem();
                unitatsPeca1.setText("");
                unitatsPeca2.setText("");
                unitatsPeca3.setText("");
                unitatsPeca4.setText("");                
                initDesplegables();
                
            }
        });
        
        
        /* Posem els ComboBox de les peces */        
        jComboBoxPeca1 = new JComboBox();
        jComboBoxPeca1.setBounds(new Rectangle(30, 70, 150, 30));
        // Accion a realizar cuando el JComboBox cambia de item seleccionado.
	      jComboBoxPeca1.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        unitatsPeca1.setText("");
                    }
                });
        add(jComboBoxPeca1);

        jComboBoxPeca2 = new JComboBox();
        jComboBoxPeca2.setBounds(new Rectangle(30, 120, 150, 30));
        // Accion a realizar cuando el JComboBox cambia de item seleccionado.
	      jComboBoxPeca2.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        unitatsPeca2.setText("");
                    }
                });
        add(jComboBoxPeca2);

        jComboBoxPeca3 = new JComboBox();
        jComboBoxPeca3.setBounds(new Rectangle(30, 170, 150, 30));
        // Accion a realizar cuando el JComboBox cambia de item seleccionado.
	      jComboBoxPeca3.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        unitatsPeca3.setText("");
                    }
                });
        add(jComboBoxPeca3);

        jComboBoxPeca4 = new JComboBox();
        jComboBoxPeca4.setBounds(new Rectangle(30, 220, 150, 30));
        // Accion a realizar cuando el JComboBox cambia de item seleccionado.
	      jComboBoxPeca4.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        unitatsPeca4.setText("");
                    }
                });
        add(jComboBoxPeca4);
        
        this.jButton2=new JButton();
        this.jButton2.setBounds(new Rectangle(150, 300, 250, 30));
        this.jButton2.setText(TDSLanguageUtils.getMessage("Presupuesto.Calcular"));
        
        /* Quan fem clic al botó que calcula el pressupost */
        
        this.jButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent paramAnonymousActionEvent) {
                
                /* Recuperem la marca del combobox de marques */
                Marca_coche mc = (Marca_coche)jComboBox.getSelectedItem();
                
                /* Omplim una llista de Linia_peca que contindrà la peça que volem
                 * les unitats i la marca. Ho fem d'aquesta manera perquè una peca 
                 * pot ser de diferents marques. Per mitjà de Linia_peca indiquem el tipus de 
                 * peca, la marca i les unitats que necessitem per fer el pressupost.
                 */
                ArrayList<Linia_peca> comanda;
                comanda = new ArrayList<Linia_peca>();
                
                
                /* Comprovem si en recuperar les dades dels desplegables, hi ha
                 * algun objecte amb id 0. Si hi ha un objecte amb id = vol dir
                 * que no s'ha de tenir en consideració
                 */
                      
                try {
                    
                    Preu_peca pPeca1 = (Preu_peca)jComboBoxPeca1.getSelectedItem();
                    if(pPeca1.getTipoPeca().getId_tipus() > 0) {
                        comanda.add(new Linia_peca(pPeca1, Integer.parseInt(unitatsPeca1.getText()), mc.getId_marca()));
                    } 

                    Preu_peca pPeca2 = (Preu_peca)jComboBoxPeca2.getSelectedItem();
                    if(pPeca2.getTipoPeca().getId_tipus() > 0) {
                        comanda.add(new Linia_peca(pPeca2, Integer.parseInt(unitatsPeca2.getText()), mc.getId_marca()));
                    } 
                    
                    Preu_peca pPeca3 = (Preu_peca)jComboBoxPeca3.getSelectedItem();
                    if(pPeca3.getTipoPeca().getId_tipus() > 0) {
                        comanda.add(new Linia_peca(pPeca3, Integer.parseInt(unitatsPeca3.getText()), mc.getId_marca()));
                    } 

                    Preu_peca pPeca4 = (Preu_peca)jComboBoxPeca4.getSelectedItem();
                    if(pPeca4.getTipoPeca().getId_tipus() > 0) {
                        comanda.add(new Linia_peca(pPeca4, Integer.parseInt(unitatsPeca4.getText()), mc.getId_marca()));
                    }                    
                    
                    /* Si el tamany de la comada és <1, vol dir que no s'ha seleccionat cap peça */
                    if(comanda.size()<1){
                          JOptionPane.showMessageDialog(p, TDSLanguageUtils.getMessage("Presupuesto.NoPiezas"));    
                    } else {
                        /* Executem el càlcul sobre la interfície remota i mostrem el missatge*/
                        String msg = gestorPreus.calculaPressupost(comanda);
                        JOptionPane.showMessageDialog(p, msg);  
                    }
                
                } catch (Exception e){
                    /* Capturem l'excepció que avisa que l'usuari no ha teclejat cap número */
                    JOptionPane.showMessageDialog(p, TDSLanguageUtils.getMessage("Presupuesto.TeclearUnidades"));
                    
                }
            }
        });
        
        p.add(jButton2);
        add(p);
        pack();
        this.setResizable(true);
        this.setClosable(true);
        this.setIconifiable(true);
        this.setMaximizable(true);
        // Se visualiza todo.
        this.setSize(600,350);
        this.setVisible(true);
    }
    
    public void conectarServerRMI() {
        try {
            Registry registry = LocateRegistry.getRegistry(URL,PORT);
            this.gestorPreus = (GestorInterface)registry.lookup(JNDI_NAME);
            
        } catch (NotBoundException e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.RMIError"));
            System.exit(0);
        } catch (RemoteException e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.RMIError"));
            System.exit(0);
        } catch (Exception e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Aplication.ExcpGeneral"));
            System.exit(0);
        }
    }

       
    public void initComboMarca(){
        this.conectarServerRMI();
        ArrayList<Marca_coche> lista;
 
        /* Per cada element de la llista, l'afegim al combobox */
        
        try {
            lista = this.gestorPreus.getMarcas();
            for(int i = 0; i < lista.size(); i++) {
                Marca_coche c = lista.get(i);
                this.jComboBox.addItem(c);
            }
            
        } catch (SQLException e){
            //System.out.println("Error en el SQL");
            Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.ErrorBD")+" : "+e.getMessage());
            Servidor.diplay("Error en ConsultaBD: " + e.getMessage());
        } catch (RemoteException e){
            //System.out.println("Error en el Remote");
            Utils.shownError(TDSLanguageUtils.getMessage("Server.RMIKOTitle"));
            Servidor.diplay("Error en RMI: " + e.getMessage());
        }
        

    }   
    
    /* Codi que inicialitza els llistats de peces */
    
    public void initComboPiezas(JComboBox j){
        this.conectarServerRMI();
    
        /* Netegem la llista */
        j.removeAllItems();
                
        ArrayList<Preu_peca> lista;
        
        /* Creem iun objecte amb id 0 per controlar si l'usuari ha seleccionat un
         * objecte vàlid de la db o no. Si id = 0, no ha seleccionat cap objecte */
         
        Preu_peca pecaNull = new Preu_peca(); 
        Tipus_peca tipusNull = new Tipus_peca(0,"");
        pecaNull.setTipoPeca(tipusNull);
        
        /* Afegim l'objecte nul a la llista */
        
        j.addItem(pecaNull);
        
        /* Creem l'objecte Marca_coche per tal de poder recuperar la marca que l'usuari té seleccionada
         * en el formulari.
         * 
         */
        Marca_coche mc = (Marca_coche)jComboBox.getSelectedItem();
        
       
        /* Obtenim la llista de Preu_peca que mostrarem al desplegable, filtrant per marca */
        try {
            lista = this.gestorPreus.getPreusByMarcaCocheDistinct(mc.getId_marca());
            for(int i = 0; i < lista.size(); i++) {
                Preu_peca p = lista.get(i);
                j.addItem(p);
            }
        } catch (SQLException e){
                Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.ErrorBD")+" : "+e.getMessage());
        } catch (RemoteException e){
                Utils.shownError(TDSLanguageUtils.getMessage("Server.RMIKOTitle"));
        }
   }
    
    /* Inicialitzem el menus desplegables de peces */
    public void initDesplegables(){
       initComboPiezas(jComboBoxPeca1);
       initComboPiezas(jComboBoxPeca2);
       initComboPiezas(jComboBoxPeca3);
       initComboPiezas(jComboBoxPeca4);
    }
    
}
